package com.proyecto.dao;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.proyecto.modelo.Ciudad;
import com.proyecto.modelo.Provincia;

/**
 * Clase que implementa los metodos de la interfaz ProvinciaDao. Utilizada para
 * generar consultas a la DB. Extiende {@link SpringHibernateDao}
 * 
 */
@Repository
public class ProvinciaDaoImpl extends SpringHibernateDao<Provincia> implements ProvinciaDao{
	/**
	 * @param sessionFactory
	 *            Objeto para abrir una sesion a la DB. Constructor de la clase.
	 */
	@Autowired
	public ProvinciaDaoImpl(SessionFactory sessionFactory) {
		super(sessionFactory);

	}

	@Override
	protected Class<Provincia> getObjetoManejado() {
		return Provincia.class;
	}
	
	
	@Override
	public void crearProvincia(String nombre, int cant_habitantes, ArrayList<Ciudad> ciudades) throws HibernateException{
		
		try{
			SessionFactory sessionFactory;
			sessionFactory = new Configuration().configure().buildSessionFactory();
			Session session = sessionFactory.openSession();
			session.beginTransaction();
			Provincia prov = new Provincia(nombre, cant_habitantes, ciudades);
			if(obtenerProvinciaPorNombre(nombre) == null){
			   session.save(prov);
			   session.getTransaction().commit();
			}
			 session.getSessionFactory().getCurrentSession().close();
		} catch (Exception e) {
			System.out.println("crearProvincia :: " + e);
		}
		
	}

	@Override
	public Provincia obtenerProvinciaPorNombre(String nombre) throws HibernateException{
		try {
			SessionFactory sessionFactory;
			sessionFactory = new Configuration().configure().buildSessionFactory();
			Session session = sessionFactory.openSession();
			session.beginTransaction();
			Provincia prov;
			Query query = session.createQuery(" from " + Provincia.class.getName() + " where nombre = :nombre ");
			query.setParameter("nombre", nombre);
			@SuppressWarnings("unchecked")
			List<Provincia> list = query.list();
			if (!list.isEmpty())
				prov = list.get(0);
			else
				prov = null;
			session.getTransaction().commit();
			session.getSessionFactory().getCurrentSession().close();
			return prov;
		} catch (Exception e) {
			System.out.println("Obtener provincia por nombre :: " + e);
			return null;
		}
	}

	@Override
	public List<Provincia> obtenerProvincias() throws HibernateException {
		try {
			SessionFactory sessionFactory;
			sessionFactory = new Configuration().configure().buildSessionFactory();
			Session session = sessionFactory.openSession();
			session.beginTransaction();

			Query query = session.createQuery(" from " + Provincia.class.getName());
			@SuppressWarnings("unchecked")
			List<Provincia> list = query.list();
			session.getTransaction().commit();
			session.getSessionFactory().getCurrentSession().close();
			return list;
		} catch (Exception e) {
			System.out.println("Obtener provincias :: " + e);
			return null;
		}
	}

	@Override
	public void eliminarProvincia(Long id_provincia) throws HibernateException {
		try {
			obtenerProvinciaPorId(id_provincia);
			if (id_provincia != null) {
				SessionFactory sessionFactory;
				sessionFactory = new Configuration().configure().buildSessionFactory();
				Session session = sessionFactory.openSession();
				session.beginTransaction();
				Query query = session.createQuery(" DELETE FROM " + Provincia.class.getName()+ " where id_provincia = :id ");
				query.setParameter("id", id_provincia);
				query.executeUpdate();
				session.getTransaction().commit();
				session.getSessionFactory().getCurrentSession().close();
			}
		} catch (Exception e) {
			System.out.println("Eliminar provincia :: " + e);
		}

	}

	@Override
	public void actualizarProvincia(Provincia prov) throws HibernateException{
		try{
			SessionFactory sessionFactory;
			sessionFactory = new Configuration().configure().buildSessionFactory();
			Session session = sessionFactory.openSession();
			session.beginTransaction();
			session.update(prov);
			session.getTransaction().commit();
			session.getSessionFactory().getCurrentSession().close();
		} catch (Exception e) {
			System.out.println("actualizar provincia :: " + e);
		}
		

	}

	@Override
	public Provincia obtenerProvinciaPorId(Long id) throws HibernateException {
		Provincia prov;
		try{
			SessionFactory sessionFactory;
			sessionFactory = new Configuration().configure().buildSessionFactory();
			Session session = sessionFactory.openSession();
			session.beginTransaction();
			Query query = session.createQuery(" from " + Provincia.class.getName() + " where id_provincia = :id ");
			query.setParameter("id", id);
			@SuppressWarnings("unchecked")
			List<Provincia> list = query.list();
			 if (!list.isEmpty())
			    prov = list.get(0);
			 else
			    prov = null;
			 session.getTransaction().commit();
			 session.getSessionFactory().getCurrentSession().close();
			 return prov;
		} catch (Exception e) {
			System.out.println("obtenerProvinciaPorId:: " + e);
			return null;
		}
		
		
	}

}
